package com.Book.test_1_25_springmvcbook.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
//
@Slf4j
@Aspect // 这个注解来自于 aspectj 这个包, 需要引入 aspect 依赖, 表示这是一个切面类
@Component // 把他交给 Spring 进行管理
public class TimeAspect {
    // 模块运行时间演示
    @Around("execution(* com.Book.test_1_25_springmvcbook.Controller.*.*(..))") // 通过这个注解来定义 哪些是我们的目标方法
    // 里面填入这个 "execution(* com.Book.test_1_25_springmvcbook.Controller.*.*(..))" 计算公式
    // 可以感受到针对 所有 的 Controller 生效的
    // 表示作用域, 作用方式, AOP在哪个环节起作用, 以及对哪些方法起作用
    public Object timeCost(ProceedingJoinPoint joinPoint) throws Throwable {
        // ProceedingJoinPoint 这个对象表示的作用的目标方法是什么
        long star = System.currentTimeMillis(); // 方法执行前的逻辑
        Object result = joinPoint.proceed(); // 执行目标方法
        long end = System.currentTimeMillis(); // 方法执行后的逻辑
        log.info("消耗时间:"+(end - star)+"ms"); // 方法执行后的逻辑
        return result;
    }
    // 接下来开始应用
    // 对之前的程序没有任何的修改
    // 这就是集中统一处理
}
